package com.carefree.system.common.utils;

import com.carefree.system.modules.admin.entity.MenuEntity;
import com.carefree.system.modules.admin.vo.MetaVo;
import com.carefree.system.modules.admin.vo.RouterVo;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @ClassName:RouterUtils
 * @Description:
 * @Author Tengbin tengbin234@163.com
 */
public class RouterUtils {


    /**
     * 根据菜单构建路由
     *
     * @param menus
     * @return
     */
    public static List<RouterVo> buildRouters(List<MenuEntity> menus) {

        List<RouterVo> routers = new LinkedList<>();

        for (MenuEntity menu : menus) {
            RouterVo router = new RouterVo();

            router.setName(setRouterName(menu));
            router.setHidden(false);
            router.setAlwaysShow(false);
            router.setPath(getRouterPath(menu));
            router.setComponent(setRouterComponent(menu));
            router.setMeta(new MetaVo(menu.getName(), menu.getIcon()));


            List<MenuEntity> children = menu.getChildren();
            //如果当前是菜单，需将按钮对应的路由加载出来，如：“角色授权”按钮对应的路由在“系统管理”下面
            if (menu.getType().intValue() == 1) {

                List<MenuEntity> hiddenMenuList = children.stream()
                        .filter(item -> ! StringUtils.isEmpty(item.getComponent()))
                        .collect(Collectors.toList());

                for (MenuEntity hiddenMenu : hiddenMenuList) {
                    RouterVo hiddenRouter = new RouterVo();
                    hiddenRouter.setName(setRouterName(hiddenMenu));
                    hiddenRouter.setHidden(true);
                    hiddenRouter.setAlwaysShow(false);
                    hiddenRouter.setPath(getRouterPath(hiddenMenu));
                    hiddenRouter.setComponent(setRouterComponent(hiddenMenu));
                    hiddenRouter.setMeta(new MetaVo(hiddenMenu.getName(), hiddenMenu.getIcon()));
                    routers.add(hiddenRouter);
                }
            } else {
                if (! CollectionUtils.isEmpty(children)) {
                    if (! children.isEmpty()) {
                        router.setAlwaysShow(true);
                    }
                    router.setChildren(buildRouters(children));
                }
            }
            routers.add(router);
        }
        return routers;
    }

    /**
     * 获取路由地址
     *
     * @param menu 菜单信息
     * @return 路由地址
     */
    public static String getRouterPath(MenuEntity menu) {
        String routerPath = "/" + menu.getPath();
        if (menu.getParentId().intValue() != 0) {
            routerPath = menu.getPath();
        }
        return routerPath;
    }


    /**
     * 给前端router设置name属性
     *
     * @param menu 菜单对象
     * @return
     */
    private static String setRouterName(MenuEntity menu) {
        // 1.菜单的path属性值不为空的情况
        String menuPath = menu.getPath();
        if (StringUtils.hasText(menuPath)) {
            return menuPath.substring(0, 1).toUpperCase() + menuPath.substring(1);
        }

        // 2.菜单的path属性值为空的情况
        // 菜单权限值一般形似 btn:user:add,视频中是btn.user.add,
        // 如果要和视频中的一样,那么就将split(":")改为split(".")
        String[] persSplit = menu.getPerms().split(":");
        if (persSplit.length < 3) {
            String firstPers = persSplit[0];
            // 如果分割出来的数组长度小于3 --> 将第一个元素的首字母大写,然后拼接 '/'和第二个元素
            return firstPers.substring(0, 1).toUpperCase() + firstPers.substring(1) + "/" + persSplit[1];
        } else {
            String firstPers = persSplit[1];
            // 否则的话将第二个元素的首字母大写,然后拼接 '/'和第三个元素
            return firstPers.substring(0, 1).toUpperCase() + firstPers.substring(1) + "/" + persSplit[2];
        }
    }

    private static String setRouterComponent(MenuEntity menu) {
        // 1. 如果当前菜单是顶层菜单 那么就它的component属性一定得是Layout
        if (menu.getParentId() == 0 || menu.getParentId() == null) {
            return "Layout";
        } else if (menu.getType() == 0 && menu.getParentId() != 0) {
            return "ParentView";
        } else {
            return menu.getComponent();
        }
    }


}
